<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class Intervencao {

    private $cod_intervencao;
    private $data;
    private $tecnico;
    private $detalhe;
    private $objeto;

    public function &getCod_intervencao() {
        return $this->cod_intervencao;
    }

    public function setCod_intervencao(&$cod_intervencao) {
        $this->cod_intervencao = &$cod_intervencao;
    }

    public function &getData() {
        return $this->data;
    }

    public function setData(&$data) {
        $this->data = &$data;
    }

    public function &getTecnico() {
        return $this->tecnico;
    }

    public function setTecnico(&$tecnico) {
        $this->tecnico = &$tecnico;
    }

    public function &getDetalhe() {
        return $this->detalhe;
    }

    public function setDetalhe(&$detalhe) {
        $this->detalhe = &$detalhe;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if (!$this->validar()) {
            throw new Exception('Intervenção existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into intervencao (cod_interno, data, detalhe, tecnico) values(?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno(), $this->data, $this->detalhe, $this->tecnico));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
        $result = $banco->getLink()->query('select cod_intervencao from intervencao where data = ? and detalhe = ? and cod_interno = ?', array($this->data, $this->detalhe, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Intervenção inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Intervenção com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_intervencao($row['cod_intervencao']);
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'data' && $this->data != $campo_valor) {
            $this->data = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Intervenção existente");
            }
        } elseif ($campo_id == 'detalhe' && $this->detalhe != $campo_valor) {
            $this->detalhe = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Intervenção existente");
            }
        } else if ($campo_id == 'tecnico' && $this->tecnico != $campo_valor) {
            $this->tecnico = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update intervencao set ' . $campo_id . ' = ? where cod_intervencao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_intervencao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from intervencao where cod_intervencao = ?');
        $result = $link->execute($stmt, array($this->cod_intervencao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
        return 1;
    }

    public static function listar(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from intervencao where cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $intervencao = new Intervencao();
            $intervencao->setCod_intervencao($row['cod_intervencao']);
            $intervencao->setData($row['data']);
            $intervencao->setDetalhe($row['detalhe']);
            $intervencao->setTecnico($row['tecnico']);
            $resultado[$row['cod_intervencao']] = &$intervencao;
            unset($intervencao);
        }
        return $resultado;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_intervencao from intervencao where data = ? and detalhe = ?', array($this->data, $this->detalhe));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }

}
?>